/*
	虚函数:
		一个指向基类的指针可用来指向从基类 公有 派生的任何对象， 这特性是C++实现运行时多态性的关键;
		如果有多个或者多层派生类，通过一个基类指针可以访问所有派生类对象的成员函数，这样就可以达到一个接口多个实现的访问了。
*/
#include <iostream>

using namespace std;

class Base {
	protected:
		int x;

	public:
		Base(int a) {
			x = a;
		}
		void who() {
			cout << "base " << x << endl;
		}
};

class First_d: public Base {
	public:
		First_d(int a): Base(a) {}
		void who() { cout << "First derivation: " << x << endl; }
};

class Second_d: public Base {
	public:
		Second_d(int a): Base(a) {}
		void who() { cout << "Second derivation." << x << endl; }
};

int main(int argc, char * argv[]) {
	Base * p;
	Base base_obj(1);
	First_d first_obj(2);
	Second_d second_obj(3);

	p = & base_obj;
	p->who();

	p = & first_obj;
	p->who();

	p = & second_obj;
	p->who();

	first_obj.who();
	second_obj.who();
	
	return 0;
}
